use std::hash::Hash;
use std::ops::Add;

pub fn learn_collection() {
  // _learn_vec();
  // _learn_string0();
  //_learn_string1();
  _learn_hashmap();
}

fn _learn_vec() {
  let mut v: Vec<i32> = Vec::new();
  //v.insert(2, 1); // runtime error
  v.insert(v.len(), 1);
  println!("v:{:?}", v);
  v.push(3);
  println!("v:{:?}", v);
  let e = v.get(v.binary_search(&3).unwrap());
  println!(
    "searched:{:?}, {:?}, {}, {}, {:p}",
    e, v, v[0], &v[0], &v[0]
  );
}
// 丢弃 vector 时也会丢弃其所有元素

fn _learn_string0() {
  let s1 = String::from("hello");
  let s2 = String::from("world");
  // +,即String上的add函数
  // s1::add();
  let s3 = s1 + " " + &s2;
  println!("{}", s3);

  let a1 = String::from("tic");
  let a2 = String::from("tac");
  let a3 = String::from("toe");
  let s = format!("{a1}-{a2}-{a3}");
  println!("{}", s);

  // rust不支持通过下标访问字符串中的某个字符
  // rust提供三种方式来解释计算机存储的原始字符串数据,字节,标量值和字形簇(最接近人类字母的概念)
  // 字符串索引应该返回哪一种是不明确的.为了更明确,使用[]和一个range值来创建含特定字节的字符串slice
}

fn _learn_string1() {
  let a = "Зд";
  for c in a.chars() {
    println!("{c}");
  }
  let a = "你好!中国人,pep世界le";
  for c in a.chars() {
    println!("{c}");
  }
}

use std::collections::HashMap;
fn _learn_hashmap() {
  let mut a = HashMap::new();
  a.insert("a", 10);
  a.insert("b", 50);
  println!("{:?}", a);
}
